import configparser
import io
import os
import base64
import threading
import tkinter as tk
from tkinter import filedialog
from tkinter.constants import *
import keyring
import requests
import ttkbootstrap as ttk
from PIL import Image, ImageTk
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Inches
from docx.shared import RGBColor
from reportlab.lib import colors
from reportlab.lib.units import inch
from ttkbootstrap.dialogs import Messagebox
from ttkbootstrap.scrolled import ScrolledFrame

base_url = "http://lgxt.wutp.com.cn/api"
headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Content-Type': 'application/x-www-form-urlencoded',
}

session = requests.Session()

SERVICE_NAME = '理工学堂'


# 网络请求函数
def login(username, password):
    login_url = f"{base_url}/login"
    data = {
        'loginName': username,
        'password': password,
    }
    try:
        response = session.post(login_url, headers=headers, data=data, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            token = result['data']
            headers['Authorization'] = token
            session.headers.update({'Authorization': token})
            return True, "欢迎回来！"
        else:
            return False, f"登录失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


def get_user_info():
    user_info_url = f"{base_url}/userInfo"
    try:
        response = session.post(user_info_url, headers=headers, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            user_info = result['data']
            return True, user_info
        else:
            return False, f"获取用户信息失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


def get_my_courses():
    my_courses_url = f"{base_url}/myCourses"
    try:
        response = session.post(my_courses_url, headers=headers, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            courses = result['data']
            return True, courses
        else:
            return False, f"获取课程列表失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


def get_course_works(course_id):
    my_course_works_url = f"{base_url}/myCourseWorks"
    data = {
        'courseId': course_id,
    }
    try:
        response = session.post(my_course_works_url, headers=headers, data=data, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            works = result['data']
            return True, works
        else:
            return False, f"获取课程作业失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


def get_questions(work_id):
    show_questions_url = f"{base_url}/showQuestions"
    data = {
        'workId': work_id,
    }
    try:
        response = session.post(show_questions_url, headers=headers, data=data, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            questions = result['data']
            return True, questions
        else:
            return False, f"获取题目失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


def submit_answer(work_id, grade):
    submit_answer_url = f"{base_url}/submitAnswer"
    data = {
        'grade': grade,
        'workId': work_id,
    }
    try:
        response = session.post(submit_answer_url, headers=headers, data=data, timeout=10)
        response.raise_for_status()
        result = response.json()
        if result['code'] == 0:
            return True, f"答案提交成功，成绩：{grade}\n返回信息：{result['data']}"
        else:
            return False, f"答案提交失败：{result['msg']}"
    except requests.exceptions.RequestException as e:
        return False, f"网络错误：{e}"


class ModernApp:
    def __init__(self, main_window):
        self.progress_bar = None
        self.progress_window = None
        self.status_label = None
        self.path_entry = None
        self.remember_var = None
        self.grade_entry = None
        self.username_entry = None
        self.password_entry = None
        self.content_frame = None
        self.main_frame = None
        self.root = main_window
        self.root.title("理工学堂助手")
        self.style = ttk.Style("darkly")
        self.root.minsize(1100, 800)

        self.username = ""
        self.password = ""
        self.courses = []
        self.works = []
        self.questions = []
        self.images = []
        self.selected_course_id = None
        self.selected_work_id = None
        self.selected_course_name = ""
        self.selected_work_name = ""
        self.login_message = ""

        self.config = configparser.ConfigParser()
        self.config_file = os.path.join(os.path.dirname(__file__), 'config.ini')

        self.export_path = os.getcwd()
        self.export_word_var = tk.BooleanVar(value=True)
        self.export_word_include_answers_var = tk.BooleanVar(value=True)
        self.export_pdf_var = tk.BooleanVar(value=False)
        self.export_pdf_include_answers_var = tk.BooleanVar(value=True)

        self.load_config()

        self.setup_ui()

    def setup_ui(self):
        self.main_frame = ttk.Frame(self.root)
        self.main_frame.pack(fill=BOTH, expand=YES)

        self.create_sidebar()

        self.content_frame = ttk.Frame(self.main_frame, padding=20)
        self.content_frame.pack(side=LEFT, fill=BOTH, expand=YES)

        self.style.configure('TButton', font=('微软雅黑', 12))

        self.style.configure('primary.TButton', background='#007bff', foreground='white')
        self.style.map('primary.TButton',
                      background=[('pressed', '!disabled', '#0056b3'),
                                  ('active', '#0069d9')],
                      foreground=[('pressed', 'white'), ('disabled', 'gray')])

        self.style.configure('secondary.TButton', background='#6c757d', foreground='white')
        self.style.map('secondary.TButton',
                      background=[('pressed', '!disabled', '#5a6268'),
                                  ('active', '#545b62')],
                      foreground=[('pressed', 'white'), ('disabled', 'gray')])

        self.style.configure('info.TButton', background='#17a2b8', foreground='white')
        self.style.map('info.TButton',
                      background=[('pressed', '!disabled', '#138496'),
                                  ('active', '#117a8b')],
                      foreground=[('pressed', 'white'), ('disabled', 'gray')])

        self.style.configure('warning.TButton', background='#ffc107', foreground='black')
        self.style.map('warning.TButton',
                      background=[('pressed', '!disabled', '#d39e00'),
                                  ('active', '#e0a800')],
                      foreground=[('pressed', 'black'), ('disabled', 'gray')])

        # 默认显示登录页面
        self.show_login_page()

    def create_sidebar(self):
        sidebar = ttk.Frame(self.main_frame, style="Sidebar.TFrame", width=250)
        sidebar.pack(side=LEFT, fill=Y, padx=10, pady=10)
        sidebar.pack_propagate(False)

        logo_data = """
        iVBORw0KGgoAAAANSUhEUgAAATUAAAEnCAYAAADIAdSUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjcgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNC0wOS0yM1QxNDoxNjo1OSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDktMjNUMTQ6MjU6MDcrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDktMjNUMTQ6MjU6MDcrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5ODNmOGVmLTM5NDYtZDI0My1hMTMyLTU2MTUyYzlkMDRjNCIgeG1wTU06RG9jdW1lbnRJRD0i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
        """
        logo_image = ImageTk.PhotoImage(Image.open(io.BytesIO(base64.b64decode(logo_data))).resize((150, 150)).convert('RGBA'))
        logo_label = ttk.Label(sidebar, image=logo_image, style="Logo.TLabel")
        logo_label.image = logo_image
        logo_label.pack(pady=20)

        nav_buttons = [
            ("课程列表", self.show_courses_page),
            ("设置", self.show_settings_page),
            ("帮助", self.show_help),
            ("退出", self.root.quit)
        ]

        for text, command in nav_buttons:
            button = ttk.Button(sidebar, text=text, command=command, cursor="hand2")
            button.pack(fill=X, pady=10)

        separator = ttk.Separator(sidebar, orient='horizontal')
        separator.pack(fill=X, pady=20)

        version_label = ttk.Label(sidebar, text="版本 1.1.0", font=("宋体", 10))
        version_label.pack(side=BOTTOM, pady=10)

        copyright_label = ttk.Label(sidebar, text="© 2024 zygame1314", font=("宋体", 10))
        copyright_label.pack(side=BOTTOM, pady=5)

    def show_help(self):
        help_window = ttk.Toplevel(self.root)
        help_window.title("帮助")
        help_window.geometry("800x600")
        help_window.resizable(True, True)

        content_frame = ScrolledFrame(help_window, autohide=True)
        content_frame.pack(fill=BOTH, expand=YES)

        ttk.Label(content_frame, text="欢迎使用理工学堂助手！", font=("微软雅黑", 20, "bold")).pack(pady=10)

        ttk.Label(content_frame, text="功能介绍：", font=("微软雅黑", 16, "bold")).pack(anchor="w", pady=5)
        features = [
            "1. 登录：输入用户名和密码进行登录。",
            "2. 课程列表：查看所有课程并选择查看作业。",
            "3. 作业列表：查看选定课程的所有作业。",
            "4. 题目列表：查看选定作业的所有题目。",
            "5. 设置：配置导出路径和格式。",
            "6. 帮助：查看本帮助信息。",
        ]
        for line in features:
            ttk.Label(content_frame, text=line, font=("微软雅黑", 12)).pack(anchor="w", padx=20)

        ttk.Label(content_frame, text="操作指南：", font=("微软雅黑", 16, "bold")).pack(anchor="w", pady=5)
        guidelines = [
            "1. 登录后，点击课程列表查看所有课程。",
            "2. 在课程列表中，点击查看作业查看该课程的所有作业。",
            "3. 在作业列表中，点击查看题目查看该作业的所有题目。",
            "4. 在题目列表中，可以导出题目或提交成绩。",
            "5. 在设置页面，可以配置导出路径和格式。",
        ]
        for line in guidelines:
            ttk.Label(content_frame, text=line, font=("微软雅黑", 12)).pack(anchor="w", padx=20)

        ttk.Label(content_frame, text="版权声明：", font=("微软雅黑", 16, "bold")).pack(anchor="w", pady=5)
        disclaimer = (
            "本软件为免费软件，仅供学习和交流使用，禁止用于任何商业用途。\n"
            "未经许可，禁止复制、修改、发布或出售本软件的任何部分。\n\n"
            "如有任何问题，请联系作者。\n"
            "感谢你的使用！"
        )
        ttk.Label(content_frame, text=disclaimer, font=("微软雅黑", 12), justify="left").pack(anchor="w", padx=20)

        ttk.Button(content_frame, text="关闭", command=help_window.destroy, bootstyle='danger', cursor="hand2").pack(pady=20)

    def show_login_page(self):
        self.clear_content()

        login_frame = ttk.Frame(self.content_frame, padding=20, style="Card.TFrame")
        login_frame.pack(expand=YES, pady=50)

        ttk.Label(login_frame, text="欢迎使用理工学堂助手", font=("微软雅黑", 24, "bold")).pack(pady=20)

        username_group = ttk.Labelframe(login_frame, text="用户名", padding=10)
        username_group.pack(fill=X, pady=10)
        self.username_entry = ttk.Entry(username_group)
        self.username_entry.pack(fill=X)

        password_group = ttk.Labelframe(login_frame, text="密码", padding=10)
        password_group.pack(fill=X, pady=10)
        self.password_entry = ttk.Entry(password_group, show="*")
        self.password_entry.pack(fill=X)

        self.remember_var = tk.BooleanVar()
        ttk.Checkbutton(login_frame, text="记住密码", variable=self.remember_var).pack(pady=10)

        ttk.Button(login_frame, text="登录", command=self.login, bootstyle="primary", width=20, cursor="hand2").pack(pady=10)

        saved_username = self.get_saved_username()
        saved_password = None
        if saved_username:
            self.username_entry.insert(0, saved_username)
            saved_password = self.get_saved_password(saved_username)
            if saved_password:
                self.password_entry.insert(0, saved_password)

        if saved_username and saved_password:
            self.remember_var.set(True)
        else:
            self.remember_var.set(False)

    def login(self):
        self.username = self.username_entry.get()
        self.password = self.password_entry.get()
        success, msg = login(self.username, self.password)
        if success:
            if self.remember_var.get():
                self.save_credentials(self.username, self.password)
            else:
                self.delete_saved_credentials()
            self.login_message = msg  # 存储登录成功的消息
            self.show_courses_page()
        else:
            Messagebox.show_error(message=msg, title="错误")

    def show_courses_page(self):
        if not self.username or not self.password:
            Messagebox.show_error(title="错误", message="请先登录")
            self.show_login_page()
            return

        self.clear_content()

        ttk.Label(self.content_frame, text="课程列表", font=("微软雅黑", 24, "bold")).pack(pady=20)

        courses_frame = ScrolledFrame(self.content_frame, autohide=True)
        courses_frame.pack(fill=BOTH, expand=YES)

        success, result = get_my_courses()
        if success:
            self.courses = result
            for course in self.courses:
                self.create_course_card(courses_frame, course)
        else:
            ttk.Label(courses_frame, text="获取课程列表失败", foreground="red").pack(pady=10)

        ttk.Button(self.content_frame, text="提交全部作业100分",
                command=self.submit_all_courses_100, bootstyle="warning", cursor="hand2").pack(pady=10)
        ttk.Button(self.content_frame, text="导出所有课程的作业",
                command=self.export_all_courses_assignments, bootstyle="info", cursor="hand2").pack(pady=10)

    def create_course_card(self, parent, course):
        card = ttk.Frame(parent, borderwidth=1, relief="solid", padding=5)
        card.pack(pady=5, padx=5, fill=X)

        row_frame = ttk.Frame(card)
        row_frame.pack(fill=X)

        ttk.Label(row_frame, text=course["courseName"], font=("微软雅黑", 14, "bold")).grid(row=0, column=0, sticky="w")

        ttk.Button(row_frame, text="查看", bootstyle="primary", cursor="hand2",
        command=lambda: self.select_course(course['courseId'], course['courseName'])).grid(row=0, column=1, sticky="e", padx=(0, 10))

        row_frame.columnconfigure(0, weight=1)
        row_frame.columnconfigure(1, weight=0)

    def select_course(self, course_id, course_name):
        self.selected_course_id = course_id
        self.selected_course_name = course_name
        success, result = get_course_works(self.selected_course_id)
        if success:
            self.works = result
            self.create_works_page()
        else:
            Messagebox.show_error(title="错误", message=result)

    def create_works_page(self):
        self.clear_content()

        ttk.Label(self.content_frame, text=f"{self.selected_course_name} - 作业列表",
                  font=("微软雅黑", 24, "bold")).pack(pady=20)

        works_frame = ScrolledFrame(self.content_frame, autohide=True)
        works_frame.pack(fill=BOTH, expand=YES)

        if not self.works:
            ttk.Label(works_frame, text="该课程目前没有可用的作业。").pack(pady=20)
        else:
            for work in self.works:
                self.create_work_card(works_frame, work)

        ttk.Button(self.content_frame, text="提交当前课程作业100分",
                command=self.submit_all_works_100, style='warning.TButton', cursor="hand2").pack(pady=10)
        ttk.Button(self.content_frame, text="导出当前课程的所有作业",
                command=self.export_all_works_of_current_course, style='info.TButton', cursor="hand2").pack(pady=10)
        ttk.Button(self.content_frame, text="返回课程列表",
                command=self.show_courses_page, style='secondary.TButton', cursor="hand2").pack(pady=10)

    def create_work_card(self, parent, work):
        card = ttk.Frame(parent, borderwidth=1, relief="solid", padding=5)
        card.pack(pady=5, padx=5, fill=X)

        row_frame = ttk.Frame(card)
        row_frame.pack(fill=X)

        ttk.Label(row_frame, text=work['workName'], font=("微软雅黑", 14, "bold")).grid(row=0, column=0, sticky="w")

        ttk.Button(row_frame, text="查看题目", bootstyle="primary", cursor="hand2",
                command=lambda: self.select_work(work['workId'], work['workName'])).grid(row=0, column=1, sticky="e", padx=(0, 5))
        ttk.Button(row_frame, text="导出所有题目", bootstyle="info", cursor="hand2",
                command=lambda: self.start_collecting_questions(work['workId'], work['workName'], self.selected_course_name)).grid(row=0, column=2, sticky="e", padx=(0, 10))

        row_frame.columnconfigure(0, weight=1)
        row_frame.columnconfigure(1, weight=0)
        row_frame.columnconfigure(2, weight=0)

    def select_work(self, work_id, work_name):
        self.selected_work_id = work_id
        self.selected_work_name = work_name
        success, result = get_questions(self.selected_work_id)
        if success:
            self.questions = result
            self.create_questions_page()
        else:
            Messagebox.show_error(title="错误", message=result)

    def create_questions_page(self):
        self.clear_content()

        ttk.Label(self.content_frame, text=f"{self.selected_work_name} - 题目列表",
                  font=("微软雅黑", 24, "bold")).pack(pady=20)

        questions_frame = ScrolledFrame(self.content_frame, autohide=True)
        questions_frame.pack(fill=BOTH, expand=YES)

        self.images = []  # 重置图像列表

        for idx, question in enumerate(self.questions):
            self.create_question_card(questions_frame, idx, question)

        grade_frame = ttk.Frame(self.content_frame)
        grade_frame.pack(pady=10)
        ttk.Label(grade_frame, text="提交成绩（0-100）：").pack(side='left', padx=5)
        self.grade_entry = ttk.Entry(grade_frame, width=10)
        self.grade_entry.pack(side='left', padx=5)
        ttk.Button(grade_frame, text="提交", command=self.submit_grade, style='primary.TButton', cursor="hand2").pack(side='left', padx=5)
        ttk.Button(self.content_frame, text="返回作业列表", command=self.create_works_page,
                style='secondary.TButton', cursor="hand2").pack(pady=10)

    def create_question_card(self, parent, idx, question):
        card = ttk.Frame(parent, borderwidth=1, relief="raised", padding=10)
        card.pack(pady=10, padx=10, fill=X)

        ttk.Label(card, text=f"题目 {idx + 1}", font=("微软雅黑", 16, "bold")).pack(anchor="w")
        ttk.Label(card, text=f"题目ID：{question.get('id', 'N/A')}").pack(anchor="w")
        ttk.Label(card, text=f"题目名称：{question.get('name', 'N/A')}").pack(anchor="w")

        imgurl = question.get('imgurl', 'N/A')
        if imgurl and imgurl != 'N/A':
            self.load_and_display_image(card, imgurl)
        else:
            ttk.Label(card, text="没有图片").pack(anchor="w")

        ttk.Label(card, text=f"答案：{question.get('answer', 'N/A')}",
                  font=("微软雅黑", 12, "italic"), foreground="yellow").pack(anchor="w", pady=5)

    def load_and_display_image(self, parent, imgurl):
        try:
            response = session.get(imgurl)
            response.raise_for_status()
            image_data = response.content
            image = Image.open(io.BytesIO(image_data))

            # 调整图像大小
            max_width = 400
            max_height = 300
            image.thumbnail((max_width, max_height))

            photo = ImageTk.PhotoImage(image)
            self.images.append(photo)
            image_label = ttk.Label(parent, image=photo)
            image_label.pack(anchor='w', pady=5)
        except Exception as e:
            ttk.Label(parent, text=f"无法加载图片：{str(e)}", foreground='red').pack(anchor='w')

    def submit_grade(self):
        grade = self.grade_entry.get()
        if grade.isdigit() and 0 <= int(grade) <= 100:
            success, result = submit_answer(self.selected_work_id, grade)
            if success:
                Messagebox.show_info(title="提示", message=result)
            else:
                Messagebox.show_error(title="错误", message=result)
        else:
            Messagebox.show_error(title="错误", message="请输入有效的成绩（0-100）。")

    def show_settings_page(self):
        self.clear_content()

        self.style.configure('Custom.TFrame', font=('微软雅黑', 12))
        self.style.configure('Custom.TLabel', font=('微软雅黑', 12))
        self.style.configure('Custom.TCheckbutton', font=('微软雅黑', 12))
        self.style.configure('Custom.TButton', font=('微软雅黑', 12))
        self.style.configure('Custom.TLabelframe', font=('微软雅黑', 12))
        self.style.configure('Custom.TLabelframe.Label', font=('微软雅黑', 12))
        self.style.configure('Custom.TEntry', font=('微软雅黑', 12))

        settings_frame = ttk.Frame(self.content_frame, padding=20, style="Card.TFrame")
        settings_frame.pack(fill=BOTH, expand=YES, padx=20, pady=20)

        ttk.Label(settings_frame, text="设置", style='Custom.TLabel',
                font=("微软雅黑", 24, "bold")).pack(pady=20)

        export_frame = ttk.LabelFrame(settings_frame, text="导出设置", padding=10,
                                    bootstyle="info", style='Custom.TLabelframe')
        export_frame.pack(fill=X, pady=10)

        export_options_frame = ttk.Frame(export_frame, style='Custom.TFrame')
        export_options_frame.pack(fill=X, pady=10)

        self.export_word_check = ttk.Checkbutton(export_options_frame, text="导出为 Word", variable=self.export_word_var,
                                                style='Custom.TCheckbutton', command=self.toggle_word_options)
        self.export_word_check.grid(row=0, column=0, sticky="w", padx=10, pady=5)

        self.export_word_answers_check = ttk.Checkbutton(export_options_frame, text="导出答案",
                                                        variable=self.export_word_include_answers_var,
                                                        style='Custom.TCheckbutton')
        self.export_word_answers_check.grid(row=1, column=0, sticky="w", padx=30, pady=5)

        self.export_pdf_check = ttk.Checkbutton(export_options_frame, text="导出为 PDF", variable=self.export_pdf_var,
                                                style='Custom.TCheckbutton', command=self.toggle_pdf_options)
        self.export_pdf_check.grid(row=0, column=1, sticky="w", padx=10, pady=5)

        self.export_pdf_answers_check = ttk.Checkbutton(export_options_frame, text="导出答案",
                                                        variable=self.export_pdf_include_answers_var,
                                                        style='Custom.TCheckbutton')
        self.export_pdf_answers_check.grid(row=1, column=1, sticky="w", padx=30, pady=5)

        self.toggle_word_options()
        self.toggle_pdf_options()

        path_frame = ttk.LabelFrame(settings_frame, text="导出路径", padding=10,
                                    bootstyle="info", style='Custom.TLabelframe')
        path_frame.pack(fill=X, pady=10)

        path_inner_frame = ttk.Frame(path_frame, style='Custom.TFrame')
        path_inner_frame.pack(fill=X)

        ttk.Label(path_inner_frame, text="路径：", style='Custom.TLabel').grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.path_entry = ttk.Entry(path_inner_frame, style='Custom.TEntry')
        self.path_entry.grid(row=0, column=1, sticky="we", padx=5, pady=5)
        self.path_entry.insert(0, self.export_path)
        ttk.Button(path_inner_frame, text="浏览", command=self.choose_export_path,
                cursor="hand2", style='Custom.TButton').grid(row=0, column=2, padx=5, pady=5)

        path_inner_frame.columnconfigure(1, weight=1)

        buttons_frame = ttk.Frame(settings_frame, style='Custom.TFrame')
        buttons_frame.pack(pady=20)

        ttk.Button(buttons_frame, text="保存设置", command=self.save_settings,
                bootstyle='primary', cursor="hand2", width=15,
                style='Custom.TButton').pack(side=LEFT, padx=10)
        ttk.Button(buttons_frame, text="查看用户信息", command=self.view_user_info,
                bootstyle='info', cursor="hand2", width=15,
                style='Custom.TButton').pack(side=LEFT, padx=10)
        
    def toggle_word_options(self):
        if self.export_word_var.get():
            self.export_word_answers_check.state(['!disabled'])
        else:
            self.export_word_answers_check.state(['disabled'])

    def toggle_pdf_options(self):
        if self.export_pdf_var.get():
            self.export_pdf_answers_check.state(['!disabled'])
        else:
            self.export_pdf_answers_check.state(['disabled'])

    def choose_export_path(self):
        path = filedialog.askdirectory(initialdir=self.export_path)
        if path:
            self.path_entry.delete(0, END)
            self.path_entry.insert(0, path)
            self.export_path = path  # 更新保存路径

    def save_settings(self):
        self.export_path = self.path_entry.get()
        self.save_config()
        Messagebox.show_info(title="提示", message="设置已保存")

    def clear_content(self):
        for widget in self.content_frame.winfo_children():
            widget.destroy()

    def load_config(self):
        if os.path.exists(self.config_file):
            self.config.read(self.config_file, encoding='utf-8')
            if 'Settings' in self.config:
                settings = self.config['Settings']
                self.export_path = settings.get('export_path', self.export_path)
                self.export_word_var.set(settings.getboolean('export_word', True))
                self.export_word_include_answers_var.set(settings.getboolean('export_word_include_answers', True))
                self.export_pdf_var.set(settings.getboolean('export_pdf', False))
                self.export_pdf_include_answers_var.set(settings.getboolean('export_pdf_include_answers', True))
        else:
            self.config['Settings'] = {
                'export_path': self.export_path,
                'export_word': 'True',
                'export_word_include_answers': 'True',
                'export_pdf': 'False',
                'export_pdf_include_answers': 'True',
            }
            with open(self.config_file, 'w', encoding='utf-8') as configfile:
                self.config.write(configfile)

    def save_config(self):
        if 'Settings' not in self.config:
            self.config['Settings'] = {}
        self.config['Settings']['export_path'] = self.export_path
        self.config['Settings']['export_word'] = str(self.export_word_var.get())
        self.config['Settings']['export_word_include_answers'] = str(self.export_word_include_answers_var.get())
        self.config['Settings']['export_pdf'] = str(self.export_pdf_var.get())
        self.config['Settings']['export_pdf_include_answers'] = str(self.export_pdf_include_answers_var.get())
        with open(self.config_file, 'w', encoding='utf-8') as configfile:
            self.config.write(configfile)

    @staticmethod
    def save_credentials(username, password):
        keyring.set_password(SERVICE_NAME, 'username', username)
        keyring.set_password(SERVICE_NAME, username, password)

    @staticmethod
    def get_saved_username():
        return keyring.get_password(SERVICE_NAME, 'username')

    @staticmethod
    def get_saved_password(username):
        return keyring.get_password(SERVICE_NAME, username)

    def delete_saved_credentials(self):
        saved_username = self.get_saved_username()
        if saved_username:
            keyring.delete_password(SERVICE_NAME, saved_username)
        keyring.delete_password(SERVICE_NAME, 'username')

    @staticmethod
    def view_user_info():
        success, result = get_user_info()
        if success:
            info = result

            def get_field(field_name):
                value = info.get(field_name)
                return value if value else 'N/A'

            message = (
                f"姓名：{get_field('userName')}\n"
                f"邮箱：{get_field('email')}\n"
                f"学号：{get_field('studentNo')}\n"
                f"学院：{get_field('schoolName')}\n"
                f"班级：{get_field('deptName')}\n"
                f"电话号码：{get_field('phonenumber')}"
            )

            Messagebox.show_info(title="用户信息", message=message)
        else:
            Messagebox.show_error(title="错误", message=result)

    def start_collecting_questions(self, work_id, work_name, course_name):
        assignment_name_clean = ''.join(c for c in work_name if c not in r'<>:"/\|?*')
        course_name_clean = ''.join(c for c in course_name if c not in r'<>:"/\|?*')

        progress_window = ttk.Toplevel(self.root)
        progress_window.title(f"收集作业 {assignment_name_clean} 的题目")
        progress_window.resizable(False, False)

        content_frame = ttk.Frame(progress_window, padding=20, style="Card.TFrame")
        content_frame.pack(expand=True, fill="both")

        self.status_label = ttk.Label(content_frame, text="开始收集题目，请稍候...", font=("微软雅黑", 12), anchor="center")
        self.status_label.pack(pady=(20, 10), expand=True, fill="x")

        self.progress_bar = ttk.Progressbar(content_frame, mode='indeterminate', length=300, bootstyle="info")
        self.progress_bar.pack(pady=(10, 20), expand=True, fill="x")
        self.progress_bar.start()

        threading.Thread(target=self.collect_all_questions,
                     args=(work_id, assignment_name_clean, course_name_clean, 100, progress_window)).start()

    def collect_all_questions(self, work_id, assignment_name, course_name, max_iterations=100, progress_window=None):
        collected_questions = {}
        no_new_questions_count = 0

        for i in range(max_iterations):
            success, questions = get_questions(work_id)
            if success:
                new_question_found = False
                for question in questions:
                    question_id = question.get('id')
                    if question_id not in collected_questions:
                        collected_questions[question_id] = question
                        new_question_found = True

                if new_question_found:
                    no_new_questions_count = 0
                    status_message = f"已收集到 {len(collected_questions)} 道题目。"
                else:
                    no_new_questions_count += 1
                    status_message = f"未发现新题目，已连续 {no_new_questions_count} 次未发现新题目。（最多重试10次）"
                    if no_new_questions_count >= 10:
                        status_message += "\n连续10次未获取到新题目，停止收集。"
                        self.root.after(0, self.status_label.config, {'text': status_message})
                        break

                self.root.after(0, self.status_label.config, {'text': status_message})
            else:
                status_message = f"获取题目失败：{questions}"
                self.root.after(0, self.status_label.config, {'text': status_message})
                break

        self.save_collected_questions(collected_questions, work_name=assignment_name, course_name=course_name, 
                              work_id=work_id, course_id=self.selected_course_id, chapter_name=assignment_name)

        self.root.after(0, self.status_label.config, {'text': f"收集完成，共收集到 {len(collected_questions)} 道题目。"})
        self.root.after(0, self.progress_bar.stop)

        self.root.after(500, progress_window.destroy)

    def save_collected_questions(self, collected_questions, work_name, course_name, work_id, course_id, chapter_name):
        assignment_name_clean = ''.join(c for c in work_name if c not in r'<>:"/\|?*')
        course_name_clean = ''.join(c for c in course_name if c not in r'<>:"/\|?*')

        assignment_name = f"{assignment_name_clean} (ID_{work_id})"
        course_folder_name = f"{course_name_clean} (ID_{course_id})"

        assignment_folder = os.path.join(self.export_path, '作业', course_folder_name, assignment_name)
        if not os.path.exists(assignment_folder):
            os.makedirs(assignment_folder)

        for question in collected_questions.values():
            self.save_question(question, assignment_folder)

        if self.export_word_var.get():
            export_answers = self.export_word_include_answers_var.get()
            self.save_questions_to_word(collected_questions, assignment_folder, chapter_name, 
                                        export_answers=export_answers)

        if self.export_pdf_var.get():
            export_answers = self.export_pdf_include_answers_var.get()
            self.save_questions_to_pdf(collected_questions, assignment_folder, chapter_name, 
                                    export_answers=export_answers)

    def export_all_courses_assignments(self):
        self.create_progress_window("正在导出所有课程的作业，请稍候...")
        threading.Thread(target=self._export_all_courses_assignments).start()

    def create_progress_window(self, title):
        self.progress_window = ttk.Toplevel(self.root)
        self.progress_window.title(title)
        self.progress_window.resizable(False, False)

        content_frame = ttk.Frame(self.progress_window, padding=20, style="Card.TFrame")
        content_frame.pack(expand=True, fill="both")

        self.status_label = ttk.Label(content_frame, text="", font=("微软雅黑", 12), anchor="center")
        self.status_label.pack(pady=(20, 10), expand=True, fill="x")

        self.progress_bar = ttk.Progressbar(content_frame, mode='determinate', length=300, bootstyle="info")
        self.progress_bar.pack(pady=(10, 20), expand=True, fill="x")

    def _export_all_courses_assignments(self):
        total_courses = len(self.courses)
        all_course_works = []
        messages = []

        total_works = 0
        for course in self.courses:
            course_id = course['courseId']
            course_name = course['courseName']
            success, result = get_course_works(course_id)
            if success:
                works = result
                total_works += len(works)
                all_course_works.append((course_id, course_name, works))
            else:
                messages.append(f"获取课程 '{course_name}' 的作业失败：{result}")

        if total_works == 0:
            self.root.after(0, self.progress_window.destroy)
            self.root.after(0, self._show_export_all_courses_results, total_courses, total_works, messages)
            return

        processed_works = 0
        self.root.after(0, self.progress_bar.config, {'maximum': total_works})

        for course_id, course_name, works in all_course_works:
            for work in works:
                work_id = work['workId']
                work_name = work['workName']
                status_text = f"正在导出课程：{course_name}\n作业：{work_name}"
                self.root.after(0, self.status_label.config, {'text': status_text})
                collected_questions = self.batch_collect_questions_with_progress(work_id, course_name, work_name)
                if collected_questions:
                    self.save_collected_questions(collected_questions, work_name, course_name, work_id, course_id, work_name)
                    messages.append(f"课程 '{course_name}' 的作业 '{work_name}' 导出成功。")
                else:
                    messages.append(f"课程 '{course_name}' 的作业 '{work_name}' 导出失败。")
                processed_works += 1
                self.root.after(0, self.progress_bar.config, {'value': processed_works})

        self.root.after(0, self.progress_window.destroy)
        self.root.after(0, self._show_export_all_courses_results, total_courses, total_works, messages)

    @staticmethod
    def _show_export_all_courses_results(total_courses, total_works, messages):
        message = "\n".join(messages)
        message = f"共处理 {total_courses} 门课程，{total_works} 个作业。\n\n{message}"
        Messagebox.show_info(title="导出结果", message=message)

    def batch_collect_questions_with_progress(self, work_id, course_name, work_name):
        collected_questions = {}
        max_iterations = 100
        no_new_questions_count = 0

        for _ in range(max_iterations):
            success, questions = get_questions(work_id)
            if success:
                new_question_found = False
                for question in questions:
                    question_id = question.get('id')
                    if question_id not in collected_questions:
                        collected_questions[question_id] = question
                        new_question_found = True
                if not new_question_found:
                    no_new_questions_count += 1
                    if no_new_questions_count >= 10:
                        break
                else:
                    no_new_questions_count = 0
                    status_text = (f"正在导出课程：{course_name}\n"
                                   f"作业：{work_name}\n"
                                   f"已获取题目数量：{len(collected_questions)}")
                    self.root.after(0, self.status_label.config, {'text': status_text})
            else:
                break
        return collected_questions

    def submit_all_courses_100(self):
        threading.Thread(target=self._submit_all_courses_100).start()

    def _submit_all_courses_100(self):
        total_courses = len(self.courses)
        total_works = 0
        success_count = 0
        fail_count = 0
        messages = []
        for course in self.courses:
            course_id = course['courseId']
            course_name = course['courseName']
            success, result = get_course_works(course_id)
            if success:
                works = result
                total_works += len(works)
                for work in works:
                    work_id = work['workId']
                    work_name = work['workName']
                    submit_success, submit_result = submit_answer(work_id, '100')
                    if submit_success:
                        success_count += 1
                        messages.append(f"课程 '{course_name}' 的作业 '{work_name}' 提交成功。")
                    else:
                        fail_count += 1
                        messages.append(f"课程 '{course_name}' 的作业 '{work_name}' 提交失败：{submit_result}")
            else:
                messages.append(f"获取课程 '{course_name}' 的作业失败：{result}")
        self.root.after(0, self._show_submit_all_courses_results, total_courses, total_works, success_count, fail_count,
                        messages)

    @staticmethod
    def _show_submit_all_courses_results(total_courses, total_works, success_count, fail_count, messages):
        message = "\n".join(messages)
        message = (f"共处理 {total_courses} 门课程，{total_works} 个作业。"
                   f"\n成功提交 {success_count} 个作业，失败 {fail_count} 个作业。\n\n{message}")
        Messagebox.show_info(title="提交结果", message=message)

    def submit_all_works_100(self):
        threading.Thread(target=self._submit_all_works_100).start()

    def _submit_all_works_100(self):
        success_count = 0
        fail_count = 0
        messages = []
        for work in self.works:
            work_id = work['workId']
            work_name = work['workName']
            success, result = submit_answer(work_id, '100')
            if success:
                success_count += 1
                messages.append(f"作业 '{work_name}' 提交成功。")
            else:
                fail_count += 1
                messages.append(f"作业 '{work_name}' 提交失败：{result}")
        self.root.after(0, self._show_submit_results, success_count, fail_count, messages)

    @staticmethod
    def _show_submit_results(success_count, fail_count, messages):
        message = "\n".join(messages)
        message = f"成功提交 {success_count} 个作业，失败 {fail_count} 个作业。\n\n{message}"
        Messagebox.show_info(title="提交结果", message=message)

    def export_all_works_of_current_course(self):
        self.create_progress_window("正在导出当前课程的所有作业，请稍候...")
        threading.Thread(target=self._export_all_works_of_current_course).start()

    def _export_all_works_of_current_course(self):
        total_works = len(self.works)
        processed_works = 0
        messages = []
        course_name = self.selected_course_name
        course_id = self.selected_course_id

        self.root.after(0, self.progress_bar.config, {'maximum': total_works})

        for work in self.works:
            work_id = work['workId']
            work_name = work['workName']
            status_text = f"正在导出作业：{work_name}"
            self.root.after(0, self.status_label.config, {'text': status_text})
            collected_questions = self.batch_collect_questions_with_progress(work_id, course_name, work_name)
            if collected_questions:
                self.save_collected_questions(collected_questions, work_name, course_name, work_id, course_id, work_name)
                messages.append(f"作业 '{work_name}' 导出成功。")
            else:
                messages.append(f"作业 '{work_name}' 导出失败。")
            processed_works += 1
            self.root.after(0, self.progress_bar.config, {'value': processed_works})

        self.root.after(0, self.progress_window.destroy)
        self.root.after(0, self._show_export_all_works_results, total_works, messages)

    @staticmethod
    def _show_export_all_works_results(total_works, messages):
        message = "\n".join(messages)
        message = f"共处理 {total_works} 个作业。\n\n{message}"
        Messagebox.show_info(title="导出结果", message=message)

    @staticmethod
    def save_question(question, assignment_folder):
        question_id = question.get('id', 'N/A')
        imgurl = question.get('imgurl', 'N/A')

        images_folder = os.path.join(assignment_folder, '题目图片')
        if not os.path.exists(images_folder):
            os.makedirs(images_folder)

        if imgurl and imgurl != 'N/A':
            try:
                response = session.get(imgurl)
                response.raise_for_status()
                image_data = response.content
                image_path = os.path.join(images_folder, f"{question_id}.png")
                with open(image_path, 'wb') as img_file:
                    img_file.write(image_data)
            except Exception as e:
                print(f"无法下载题目 {question_id} 的图片：{e}")

    @staticmethod
    def save_questions_to_word(collected_questions, assignment_folder, work_name, export_answers=True):
        document = Document()

        style = document.styles['Normal']
        font_style = style.font
        font_style.name = '宋体'
        font_style.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

        document.add_heading(work_name, 0)

        images_folder = os.path.join(assignment_folder, '题目图片')

        sorted_question_ids = sorted(collected_questions.keys(), key=lambda x: int(x))

        for idx, question_id in enumerate(sorted_question_ids):
            question = collected_questions[question_id]
            name = question.get('name', 'N/A')
            answer = question.get('answer', 'N/A')

            document.add_heading(f'题目 {idx + 1}: {name}', level=2)

            image_path = os.path.join(images_folder, f"{question_id}.png")
            if os.path.exists(image_path):
                document.add_picture(image_path, width=Inches(5))
            else:
                document.add_paragraph("（无图片）")

            if export_answers:
                answer_paragraph = document.add_paragraph("答案：")
                answer_run = answer_paragraph.add_run(answer)
                answer_run.font.color.rgb = RGBColor(255, 0, 0)

        docx_path = os.path.join(assignment_folder, f'{work_name}.docx')
        document.save(docx_path)

    @staticmethod
    def save_questions_to_pdf(collected_questions, assignment_folder, work_name, export_answers=True):
        from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
        from reportlab.pdfbase import pdfmetrics
        from reportlab.pdfbase.cidfonts import UnicodeCIDFont
        from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Image as RLImage, Spacer
        from reportlab.lib.pagesizes import A4
        from reportlab.lib.utils import ImageReader

        pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))

        styles = getSampleStyleSheet()
        styles.add(ParagraphStyle(
            name='ChineseTitle',
            parent=styles['Title'],
            fontName='STSong-Light',
            fontSize=20,
            leading=24,
            alignment=1,
            textColor=colors.HexColor('#333333')
        ))
        styles.add(ParagraphStyle(
            name='ChineseHeading1',
            parent=styles['Heading1'],
            fontName='STSong-Light',
            fontSize=16,
            leading=20,
            textColor=colors.HexColor('#555555')
        ))
        styles.add(ParagraphStyle(
            name='Chinese',
            fontName='STSong-Light',
            fontSize=12,
            leading=18,
            textColor=colors.HexColor('#000000')
        ))
        normal_style = styles['Chinese']

        def add_page_number(canvas, _doc):
            page_num = canvas.getPageNumber()
            text = f"第 {page_num} 页"
            canvas.setFont('STSong-Light', 9)
            canvas.drawRightString(A4[0] - 50, 15, text)

        left_margin = 40
        right_margin = 40
        top_margin = 60
        bottom_margin = 60

        doc = BaseDocTemplate(
            os.path.join(assignment_folder, f'{work_name}.pdf'),
            pagesize=A4,
            rightMargin=right_margin,
            leftMargin=left_margin,
            topMargin=top_margin,
            bottomMargin=bottom_margin
        )

        page_width, page_height = A4
        frame_width = page_width - left_margin - right_margin
        frame_height = page_height - top_margin - bottom_margin

        frame = Frame(left_margin, bottom_margin, frame_width, frame_height, id='normal')

        template = PageTemplate(id='test', frames=frame, onPage=add_page_number)
        doc.addPageTemplates([template])

        elements = [Paragraph(f'{work_name}', styles['ChineseTitle']), Spacer(1, 0.3 * inch)]

        images_folder = os.path.join(assignment_folder, '题目图片')

        sorted_question_ids = sorted(collected_questions.keys(), key=lambda x: int(x))

        for idx, question_id in enumerate(sorted_question_ids):
            question = collected_questions[question_id]
            name = question.get('name', 'N/A')
            answer = question.get('answer', 'N/A')

            title_text = f'题目 {idx + 1}: {name}'
            elements.append(Paragraph(title_text, styles['ChineseHeading1']))
            elements.append(Spacer(1, 0.1 * inch))

            image_path = os.path.join(images_folder, f"{question_id}.png")
            if os.path.exists(image_path):
                img = ImageReader(image_path)
                img_width, img_height = img.getSize()
                aspect = img_height / float(img_width)

                img_display_width = doc.width * 0.8
                img_display_height = img_display_width * aspect

                elements.append(RLImage(image_path, width=img_display_width, height=img_display_height))
            else:
                elements.append(Paragraph("（无图片）", normal_style))

            if export_answers:
                answer_paragraph = Paragraph(f"答案：<font color='red'>{answer}</font>", normal_style)
                elements.append(answer_paragraph)

            elements.append(Spacer(1, 0.2 * inch))

        doc.build(elements)


if __name__ == "__main__":
    root = ttk.Window()
    app = ModernApp(root)
    root.mainloop()
